// 访问日志
// basic/logger

package basic

import (
	"api/models"
	"api/src"
	"api/utils"
	"api/utils/MyRedis"

	"github.com/beego/beego/v2/core/validation"
)

type LoggerC struct {
	src.BaseC
}

func (c LoggerC) Search() {
	table, errMsg := c.ReadData(src.ReadParams{Model: models.Logger{}})
	if errMsg != "" {
		c.ServerJSON(src.Msg{false, errMsg}, 500)
		return
	}

	// 额外返回用户名字段
	userTable, errMsg := c.ReadData(src.ReadParams{Model: models.User{}})
	if errMsg != "" {
		c.ServerJSON(src.Msg{false, errMsg}, 500)
		return
	}

	// 建立映射表，根据用户id，获取用户名。
	mapping := map[uint32]string{}
	for _, item := range userTable.TableData {
		id := item["id"].(uint32)
		userName := item["userName"].(string)
		mapping[id] = userName
	}

	for _, item := range table.TableData {
		userId := item["userId"].(uint32)
		userName := mapping[userId]
		item["userName"] = userName
	}

	c.ServerJSON(src.Response{true, table})
}

// ForbidIP 封IP
// 请求参数：ip=192.168.128.100,day=1
func (c LoggerC) ForbidIP() {
	ip := c.GetString("ip")
	valid := validation.Validation{}
	valid.Required(ip, "ip")
	valid.IP(ip, "ip")
	if valid.HasErrors() {
		c.ServerJSON(src.Msg{false, utils.Translate(valid.Errors[0])}, 400)
		return
	}

	day, err := c.GetInt64("day", 0)
	if err != nil {
		c.ServerJSON(src.Msg{false, err.Error()}, 400)
		return
	}

	valid.Range(day, 0, 365, "day")
	if valid.HasErrors() {
		c.ServerJSON(src.Msg{false, utils.Translate(valid.Errors[0])}, 400)
		return
	}

	ip0, errMsg := MyRedis.GetData("blackIP_" + ip)
	if errMsg != "" {
		c.ServerJSON(src.Msg{false, "redis读取黑名单IP发生错误：" + errMsg}, 500)
		return
	}

	if ip0 == ip {
		c.ServerJSON(src.Msg{false, "此IP之前已被禁止，无须重新设置。"})
		return
	}

	unit := "天"
	duration := 60 * 60 * 24 * day
	if day == 0 {
		day = 1
		unit = "小时"
		duration = 60 * 60 * 1
	}
	errMsg = MyRedis.SetData("blackIP_"+ip, ip, duration)
	if errMsg != "" {
		c.ServerJSON(src.Msg{false, "redis设置黑名单IP发生错误：" + errMsg}, 500)
		return
	}

	c.ServerJSON(src.Response{
		true,
		"禁止IP " + ip + " 访问本系统" + utils.ToStr(day) + unit + "，设置成功。",
	})
}

// ForbidUser 封用户
// 请求参数：userId=1,day=1
func (c LoggerC) ForbidUser() {
	userId, err := c.GetUint32("userId", 0)
	if err != nil {
		c.ServerJSON(src.Msg{false, err.Error()}, 400)
		return
	}

	day, err := c.GetInt64("day", 0)
	if err != nil {
		c.ServerJSON(src.Msg{false, err.Error()}, 400)
		return
	}

	valid := validation.Validation{}
	valid.Range(day, 0, 365, "day")
	if valid.HasErrors() {
		c.ServerJSON(src.Msg{false, utils.Translate(valid.Errors[0])}, 400)
		return
	}

	uid := utils.ToStr(userId)
	userId0, errMsg := MyRedis.GetData("blackUser_" + uid)
	if errMsg != "" {
		c.ServerJSON(src.Msg{false, "redis读取黑名单用户发生错误：" + errMsg}, 500)
		return
	}

	if userId0 == uid {
		c.ServerJSON(src.Msg{false, "此用户之前已被禁止，无须重新设置。"})
		return
	}

	unit := "天"
	duration := 60 * 60 * 24 * day
	if day == 0 {
		day = 1
		unit = "小时"
		duration = 60 * 60 * 1
	}
	errMsg = MyRedis.SetData("blackUser_"+uid, uid, duration)
	if errMsg != "" {
		c.ServerJSON(src.Msg{false, "redis设置黑名单用户发生错误：" + errMsg}, 500)
		return
	}

	c.ServerJSON(src.Response{
		true,
		"禁止用户 " + uid + " 访问本系统" + utils.ToStr(day) + unit + "，设置成功。",
	})
}

// GetUser 获取单条用户数据
// 请求参数：id=1
func (c LoggerC) GetUser() {
	userId, err := c.GetUint32("id", 0)
	if err != nil {
		c.ServerJSON(src.Msg{false, err.Error()}, 400)
		return
	}

	query := map[string]interface{}{}
	query["id"] = userId
	table, errMsg := c.ReadData(src.ReadParams{
		Model:  models.User{},
		Field:  "id, userName, name, phone, email, addTime",
		Filter: src.Filter{Query: query},
	})
	if errMsg != "" {
		c.ServerJSON(src.Msg{false, errMsg}, 500)
		return
	}

	if len(table.TableData) == 0 {
		c.ServerJSON(src.Msg{false, "查无此人"}, 404)
		return
	}

	c.ServerJSON(src.Response{true, table.TableData[0]})
}
